package day12;

public
class TestVolatile {
    public static
    void main(String[] args) {
        new Visi1().start();
        new Visi2().start();
    }
}
class User{
    //volatile关键字可以保证变量的可见性，即当一个线程修改了volatile变量的值，其他线程能够立即看到这个修改。
    //原因在于每个线程都有自己的工作内存，多个线程直接还有一个主内存，volatile变量的值被修改后，其他线程工作内存中的值会失效，强制性刷新主内存中的值。
    //类似于static（保证对象共享） volatile（保证线程中的分享）
    static  volatile int money=1000;
}
class Visi1 extends Thread{
    public void run(){//检测余额是否发生变化
        while (User.money==1000){
            //每次打印都是通过mian（主内存） 所以有线程改变 主内存更新 其他线程也会更新
//            System.out.println(Thread.currentThread().getName()+"发现余额没有变化："+User.money);
        }
        System.out.println(Thread.currentThread().getName()+"发现余额发生变化："+User.money);
    }
}
class Visi2 extends Thread{
    public void run(){//3s后修改余额
        try {
            while (true) {
                Thread.sleep(3000);
                User.money+=2000;
                System.out.println(Thread.currentThread().getName()+"修改余额为："+User.money);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }
}